// 题目链接：https://www.luogu.com.cn/problem/P2089

#include <iostream>

using namespace std;

int n;
int res = 0; // 保存方案总数

int q[11];          // 保存临时方案
int mem[59055][11]; // 保存所以方案

// x 表示当前枚举到了第x种配料，sum 表示当前放的所有配料质量之和
void DFS(int x, int sum)
{
    // 剪枝
    if (sum > 30)
    {
        return;
    }

    // 10种配料已经全部放完了
    if (x > 10)
    {
        if (sum == n)
        {          // 如果所有配料质量之和等于美味程度
            ++res; // 方案数加1
            for (int i = 1; i <= 10; ++i)
            { // 将临时方案存到最终输出的方案中去
                mem[res][i] = q[i];
            }
        }
        return;
    }

    for (int i = 1; i <= 3; ++i)
    {
        q[x] = i;

        DFS(x + 1, sum + i);

        // 恢复环境
        q[x] = 0;
    }
}

int main()
{
    scanf("%d", &n);

    if (n < 10 || n > 30)
    {
        printf("0\n");
        return 0;
    }

    DFS(1, 0);
    // 输出所有方案
    printf("%d\n", res);
    for (int i = 1; i <= res; ++i)
    {
        for (int j = 1; j <= 10; ++j)
        {
            printf("%d ", mem[i][j]);
        }
        printf("\n");
    }

    return 0;
}